import pandas as pd
# 获得表头中有几个字段，写入文件的时候一次写入与字段匹配的 item 保证了一次写入一行
# 这个有得优化的地方：只读文件的第一行，那就完美了，而不是将文件全部读取，然后定义一个 index 当 index =1 停止输出
def get_fields_count(path):
	df = pd.read_csv(path)
	# df 类型：DataFrame
	# df.columns.values.item() 返回 str 类型
	fields_num = len(df.columns.values.item().strip().split())
	return fields_num

# 打开原文件，将文件中的每一项添加到一个列表中，同样的表头也加入到这个列表中，按行的顺序添加	
def open_file(path):
	new_content_list = []
	with open(path) as fd:
		content_list = fd.readlines()
		for lines in content_list:
			line = lines.strip().split(" ")
			for content in line:
				# 由于文件中有很多空格，所以要将空格过滤掉
				if content == "":
					continue
				new_content_list.append(content.strip())
	return new_content_list
	
def write_to_file(path):
	fd = open(path,"w")
	return fd

# 获取文件所有项的字符串最大长度，本程序对齐的思想就是找到最长的字符串，然后让其他字符串按照这个最大长度加上一个固定长度为标准
# 之所以要让所有字符串的最大长度 + 一个固定的长度，主要考虑最长的字符串和其他字符串之间可能没有空格隔开
# 得到标准后，格式化所有的字符串，左对齐，当前字符串对于标准的长度不足的以空格补充，这样就能够达到所有的字段对齐的目的
def get_fields_max_length(path):
	fields_max_length = 0
	content_list = open_file(path)
	for content in content_list:
		if(len(content)) > fields_max_length:
			fields_max_length = len(content)
	return fields_max_length
			
	
def process_file(sourcepath,destpath):

	new_content_list = []
	content_list = open_file(sourcepath)
	fd = write_to_file(destpath)
	fields_num = get_fields_count(sourcepath)
	fields_max_length = get_fields_max_length(sourcepath)
	fields_length = fields_max_length + 3
	for i in content_list:
		# 所有的字符串左对齐，右边补充空格，使得所有的字符串长度一样，注意这里使用format貌似不成功
		# '{:<15}'.format(i)  这里的15 就是fields_length，但是这里貌似不能使用变量
		# '{:<fields_length}'.format(i)  这条语句报语法错误
		new_content_list.append(i.strip().ljust(fields_length))
	
	# loopnum 原文件的行数
	loopnum = len(content_list) / fields_num
	for i in range(int(loopnum)):
		# 一次写入一行
		fd.writelines(new_content_list[i * fields_num :(i+1)*fields_num])
		fd.write("\n")
def main():
    sourcepath = "../data/1.txt"
    destpath="../data/3.txt"
    process_file(sourcepath,destpath)
    

if __name__ == "__main__":
    main()

"""
此代码的功能：将文件中的字段对齐，然后写入另一个文件。原文件是 hive 执行查询后所得的结果，目的是想将 hive 输出格式，
现在目前只实现了在文件中格式，最好的方式是在 hive 中写一个自定义的函数，然后在 hive 客户端中调用函数，格式化输出。
做成像 mysql 那样
原文件：
emp.empno   emp.ename   emp.job emp.mgr emp.hiredate    emp.sal emp.comm    emp.deptno
7369    SMITH   CLERK   7902    1980-12-17  800.0   20.0    10
7521    WARD    SALESMAN    7698    1981-2-22   1250.0  500.0   10
7782    CLARK   MANAGER 7839    1981-6-9    2450.0  10.0    10
7900    JAMES   CLERK   7698    1981-12-3   950.0   31.0    10
7934    MILLER  CLERK   7782    1982-1-23   1300.0  10.0    10
新文件：
emp.empno      emp.ename      emp.job        emp.mgr        emp.hiredate   emp.sal        emp.comm       emp.deptno     
7369           SMITH          CLERK          7902           1980-12-17     800.0          20.0           10             
7521           WARD           SALESMAN       7698           1981-2-22      1250.0         500.0          10             
7782           CLARK          MANAGER        7839           1981-6-9       2450.0         10.0           10             
7900           JAMES          CLERK          7698           1981-12-3      950.0          31.0           10             
7934           MILLER         CLERK          7782           1982-1-23      1300.0         10.0           10 
"""